<?php
require_once $_SERVER['DOCUMENT_ROOT'].'/actions/Response.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/entities/Person.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/exceptions/DataBaseException.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/utils/Logger.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/const/Error.php';
/**
 * Абстрактный класс, отвечающий за действие пользователя
 */
abstract class Action {
	/**
	 * Абстрактный метод, который выполняет обработку пользовательского запроса
	 * (данные берутся из глобальных массивов PHP: $_GET[], $_POST[], и т.д.
	 * @param Response $response Объект, хранящий необходимую информацию
	 * для формирования ответа пользователю 
	 */
	abstract protected function execute(Response $response);
	
	/**
	 * Метод, возвращающий массив
	 * @return array() Массив
	 */
	protected function accessIdentities() {
		return array();
	}

	final public function exec() {

	// Создаём новый объект для работы с информацией необходимой для 
	// формирования ответа пользователю
		$response = new Response();
		$isAccess = false;
		$allowRoles = $this->accessIdentities();
		if($allowRoles !== null) {
			//Проверка на наличие user (пользователя)
			if(isset($_SESSION['user'])) {
				$user = unserialize($_SESSION['user']);
				$roles = $user->getRoles();
				//Пробегаем массив $roles
				foreach($roles as $role) {
					if(in_array($role->getIdentity(), $allowRoles, true)) {
						$isAccess = true;
						break;
					}
				}
			}
		} else {
			$isAccess = true;
		}
		if($isAccess) {
			try {
				$this->execute($response);
			} catch(DataBaseException $exception) {
				$message = 'data base error ['.$exception->getCode().'] ';
				$message .= $exception->getMessage();
				Logger::error($message);
				$response->setError(Error::DATA_BASE_ERROR);
			}
		} else {
			$response->setActionPath('/login.html');
		}
		return $response;
	}
}
?>